package cn.techjc.utils;

import java.text.DateFormatSymbols;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Enumeration;
import java.util.Hashtable;

/*
 * ===========================================================================
 * Copyright 2007 WEBTRANING Corp. All Rights Reserved.
 * WEBTRANING PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 * ===========================================================================
 * @version 1.0, 2007-8-11
 *  
 * ===========================================================================
 * 
 */

public class Dater {

	public static String DATE_FORMAT_YMDHMS = "YYYY-MM-DD HH24:MI:SS";
	
	public static String DATE_FORMAT_YMD = "YYYY-MM-DD";
	
	public Dater() {
		super();
		//constructor from parent
	}
	/**
	 * 返回系统当前日期
	 * @return
	 */

	public static java.sql.Date getCurrentDate() {
		return new java.sql.Date(System.currentTimeMillis());
	}
	/**
	 * 将日期型数据转换�? YYYY-MM-DD 格式的字符串
	 * 
	 * @param d java.util.Date
	 * @return 格式化后的字符串
	 */
	public static String getYMDFormatDate(Date d) {
		return getDate(d, "YYYY-MM-DD");
	}
	
	/**
	 * 将日期型数据转换�? YYYY-MM-DD HH24:MI:SS 格式的字符串
	 * 
	 * @param d java.util.Date
	 * @return 格式化后的字符串
	 */
	public static String getYMDHMSFormatDate(Date d) {
		return getDate(d, "YYYY-MM-DD HH24:MI:SS");
	}
	
	/**
	 * 将日期型数据转换�? YYYYMMDDHH24MISS 格式的字符串
	 * 
	 * @param d java.util.Date
	 * @return 格式化后的字符串
	 */
	public static String getNoSeparatorYMDHMSFormatDate(Date d) {
		return getDate(d, "YYYYMMDDHH24MISS");
	}
	
	/**
	 * 将日期型数据转换�? YYYY年MM月DD�? E HH24:MI 格式的字符串
	 * 
	 * @param d java.util.Date
	 * @return 格式化后的字符串
	 */
	public static String getYMDEHMFormatDate() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd�? E HH:MM");
		return sdf.format(new Date());
	}
	
	
	/**
	 * 将日期型数据转换�? YYYY-MM-DD HH24:MI 格式的字符串
	 * 
	 * @param d java.util.Date
	 * @return 格式化后的字符串
	 */
	public static String getYMDHMFormatDate(Date d) {
		return getDate(d, "YYYY-MM-DD HH24:MI");
	}
	/**
	 * 获取输入格式的日期字符串，字符串遵循Oracle格式
	 * 
	 * @param d -日期
	 * @param format -指定日期格式，格式的写法为Oracle格式
	 * @return 按指定的日期格式转换后的日期字符�?
	 */
	public static String getDate(Date d, String format) {
		if (d == null)
			return "";
		Hashtable h = new Hashtable();
		String javaFormat = new String();
		String s = format.toLowerCase();
		if (s.indexOf("yyyy") != -1)
			h.put(new Integer(s.indexOf("yyyy")), "yyyy");
		else if (s.indexOf("yy") != -1)
			h.put(new Integer(s.indexOf("yy")), "yy");
		if (s.indexOf("mm") != -1)
			h.put(new Integer(s.indexOf("mm")), "MM");

		if (s.indexOf("dd") != -1)
			h.put(new Integer(s.indexOf("dd")), "dd");
		if (s.indexOf("hh24") != -1)
			h.put(new Integer(s.indexOf("hh24")), "HH");
		if (s.indexOf("mi") != -1)
			h.put(new Integer(s.indexOf("mi")), "mm");
		if (s.indexOf("ss") != -1)
			h.put(new Integer(s.indexOf("ss")), "ss");

		int intStart = 0;
		while (s.indexOf("-", intStart) != -1) {
			intStart = s.indexOf("-", intStart);
			h.put(new Integer(intStart), "-");
			intStart++;
		}

		intStart = 0;
		while (s.indexOf("/", intStart) != -1) {
			intStart = s.indexOf("/", intStart);
			h.put(new Integer(intStart), "/");
			intStart++;
		}

		intStart = 0;
		while (s.indexOf(" ", intStart) != -1) {
			intStart = s.indexOf(" ", intStart);
			h.put(new Integer(intStart), " ");
			intStart++;
		}

		intStart = 0;
		while (s.indexOf(":", intStart) != -1) {
			intStart = s.indexOf(":", intStart);
			h.put(new Integer(intStart), ":");
			intStart++;
		}
		
		intStart = 0;
		while (s.indexOf(".", intStart) != -1) {
			intStart = s.indexOf(".", intStart);
			h.put(new Integer(intStart), ".");
			intStart++;
		}

		if (s.indexOf("�?") != -1)
			h.put(new Integer(s.indexOf("�?")), "�?");
		if (s.indexOf("�?") != -1)
			h.put(new Integer(s.indexOf("�?")), "�?");
		if (s.indexOf("�?") != -1)
			h.put(new Integer(s.indexOf("�?")), "�?");
		if (s.indexOf("�?") != -1)
			h.put(new Integer(s.indexOf("�?")), "�?");
		if (s.indexOf("�?") != -1)
			h.put(new Integer(s.indexOf("�?")), "�?");
		if (s.indexOf("�?") != -1)
			h.put(new Integer(s.indexOf("�?")), "�?");

		int i = 0;
		while (h.size() != 0) {
			Enumeration e = h.keys();
			int n = 0;
			while (e.hasMoreElements()) {
				i = ((Integer) e.nextElement()).intValue();
				if (i >= n)
					n = i;
			}
			String temp = (String) h.get(new Integer(n));
			h.remove(new Integer(n));

			javaFormat = temp + javaFormat;
		}
		SimpleDateFormat df = new SimpleDateFormat(javaFormat, new DateFormatSymbols());

		return df.format(d);
	}
	
	/**
	 * 将指定格式的字符串转换为日期�?
	 * 
	 * @param strDate -日期
	 * @param oracleFormat--oracle型日期格�?
	 * @return 转换得到的日�?
	 */
	public static Date stringToDate(String strDate, String oracleFormat) {
		// SimpleDateFormat df=new SimpleDateFormat(javaFormat,new
		// DateFormatSymbols());
		// SimpleDateFormat df = new SimpleDateFormat(javaFormat);
		if (strDate == null)
			return null;
		Hashtable h = new Hashtable();
		String javaFormat = new String();
		String s = oracleFormat.toLowerCase();
		if (s.indexOf("yyyy") != -1)
			h.put(new Integer(s.indexOf("yyyy")), "yyyy");
		else if (s.indexOf("yy") != -1)
			h.put(new Integer(s.indexOf("yy")), "yy");
		if (s.indexOf("mm") != -1)
			h.put(new Integer(s.indexOf("mm")), "MM");

		if (s.indexOf("dd") != -1)
			h.put(new Integer(s.indexOf("dd")), "dd");
		if (s.indexOf("hh24") != -1)
			h.put(new Integer(s.indexOf("hh24")), "HH");
		if (s.indexOf("mi") != -1)
			h.put(new Integer(s.indexOf("mi")), "mm");
		if (s.indexOf("ss") != -1)
			h.put(new Integer(s.indexOf("ss")), "ss");

		int intStart = 0;
		while (s.indexOf("-", intStart) != -1) {
			intStart = s.indexOf("-", intStart);
			h.put(new Integer(intStart), "-");
			intStart++;
		}

		intStart = 0;
		while (s.indexOf("/", intStart) != -1) {
			intStart = s.indexOf("/", intStart);
			h.put(new Integer(intStart), "/");
			intStart++;
		}

		intStart = 0;
		while (s.indexOf(" ", intStart) != -1) {
			intStart = s.indexOf(" ", intStart);
			h.put(new Integer(intStart), " ");
			intStart++;
		}

		intStart = 0;
		while (s.indexOf(":", intStart) != -1) {
			intStart = s.indexOf(":", intStart);
			h.put(new Integer(intStart), ":");
			intStart++;
		}

		if (s.indexOf("�?") != -1)
			h.put(new Integer(s.indexOf("�?")), "�?");
		if (s.indexOf("�?") != -1)
			h.put(new Integer(s.indexOf("�?")), "�?");
		if (s.indexOf("�?") != -1)
			h.put(new Integer(s.indexOf("�?")), "�?");
		if (s.indexOf("�?") != -1)
			h.put(new Integer(s.indexOf("�?")), "�?");
		if (s.indexOf("�?") != -1)
			h.put(new Integer(s.indexOf("�?")), "�?");
		if (s.indexOf("�?") != -1)
			h.put(new Integer(s.indexOf("�?")), "�?");

		int i = 0;
		while (h.size() != 0) {
			Enumeration e = h.keys();
			int n = 0;
			while (e.hasMoreElements()) {
				i = ((Integer) e.nextElement()).intValue();
				if (i >= n)
					n = i;
			}
			String temp = (String) h.get(new Integer(n));
			h.remove(new Integer(n));

			javaFormat = temp + javaFormat;
		}
		// System.out.println(javaFormat);
		SimpleDateFormat df = new SimpleDateFormat(javaFormat);

		Date myDate;
		try {
			myDate = df.parse(strDate);
		} catch (Exception e) {
			return null;
		}

		return myDate;
	}
	
	/**
	 * 将日期型数据转换�? YYYYMMDD 格式的字符串
	 * 
	 * @param d java.util.Date
	 * @return 格式化后的字符串
	 */
	public static String getNoSeparatorYMDFormatDate(Date d) {
		return getDate(d, "YYYYMMDD");
	}
	
	/**
	 * 将字符串类型时间串（YYYY-MM-DD）转成Calendar类型
	 * @param dateStr
	 * @return
	 */
	public static Calendar getYMDFormatCalendar(String dateStr) {
		Calendar result = Calendar.getInstance();
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Date date = null;
		try {
			date = sdf.parse(dateStr);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		result.setTime(date);
		
		return result;
	}
	
	/**
	 * 将字符串类型时间串（YYYY-MM-DD HH24:MI:SS）转成Calendar类型
	 * @param dateStr
	 * @return
	 */
	public static Calendar getYMDHMSFormatCalendar(String dateStr) {
		Calendar result = Calendar.getInstance();
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date date = null;
		try {
			date = sdf.parse(dateStr);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		result.setTime(date);
		
		return result;
	}
	
	/**
	 * 将日期型数据转换�? YYYY年MM月DD�? E HH24时MI�? 格式的字符串
	 * 
	 * @param d
	 *            java.util.Date
	 * @return 格式化后的字符串
	 */
	public static String getYMDEHMFormatDate(String d) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd�? HH时mm�?");
		return sdf.format(stringToDate(d, DATE_FORMAT_YMDHMS));
	}
	
	/**
	 * 将string类型日期格式数据转换�? YYYY年MM月DD日格式的字符�?
	 * 
	 * @param String
	 * @return 格式化后的字符串
	 */
	public static String getYMDFormatStrDate(String date) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd�?");
		return sdf.format(stringToDate(date, "yyyy-MM-dd"));
	}
	
	/**
	 * 将日期型数据转换�? YYYY年MM月DD�? E HH24时MI�? 格式的字符串
	 * 
	 * @param d
	 *            java.util.Date
	 * @return 格式化后的字符串
	 */
	public static String getYMDEHMFormatDate(Date d) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd�? HH时mm�?");
		return sdf.format(d);
	}
	/*** 
     * 日期天数加减
     * @param day  增减天数
     * @param option 
     *            传入类型 pro：日期减天数，next：日期加天数
     * @param _date 
     *            2014-11-24 
     * @return 减一天：2014-11-23�?(加一天：2014-11-25) 
     */  
    public static String checkOption(String option, String _date,int day) {  
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
        Calendar cl = Calendar.getInstance();  
        Date date = null;  
  
        try {  
            date = (Date) sdf.parse(_date);  
        } catch (ParseException e) {  
            e.printStackTrace();  
        }  
        cl.setTime(date);  
        if ("pre".equals(option)) {  
            // 时间减天  
            cl.add(Calendar.DAY_OF_MONTH, -day);  
  
        } else if ("next".equals(option)) {  
            // 时间加天  
            cl.add(Calendar.DAY_OF_YEAR, day);  
        } else {  
            // do nothing  
        }  
        date = cl.getTime();  
        return sdf.format(date);  
    }
    
    /**
	 * 将Calendar数据转换�? YYYY-MM-DD格式的字符串
	 * 
	 * @param d
	 * 			java.util.Calendar
	 * @return 格式化后的字符串
	 */
	public static String getYMDFormatForCalendar(Calendar cal) {
		StringBuilder result = new StringBuilder();
		result.append(cal.get(Calendar.YEAR));
		result.append("-");
		
		int month = cal.get(Calendar.MONTH) + 1;
		if(month <= 9) {
			result.append("0" + month);
			result.append("-");
		} else {
			result.append(month);
			result.append("-");
		}
		int date = cal.get(Calendar.DATE);
		if(date <= 9) {
			result.append("0" + date);
		} else {
			result.append(date);
		}
		
		return result.toString();
	}
}
